/**
 * @file key_contorl.c
 * @brief 按键控制模块源文件
 * @version 0.1
 * @date 2024-03-21
 */

#include "key_contorl.h"
#include "beep_control.h"
#include "system_init.h"
#include "display_control.h"

/*按键数量*/
#define KEY_CNT               4

/* 按键引脚定义 */
#define KEY_QUANTITY_VALUE    KEY_QUANTITY_PIN
#define KEY_SPEED_VALUE       KEY_SPEED_PIN
#define KEY_MODE_VALUE        KEY_MODE_PIN
#define KEY_FUNCTION_VALUE    KEY_FUNCTION_PIN

/* 按键状态数组 */
static key_status_struct_t keyStatus[4];

/* 按键配置 */
static const key_config_struct_t keyConfig = {
    10,    	// debounceTime: 20ms消抖时间
		30,		// shortPressTime：100ms短按时间
    500,   	// longPressTime: 1000ms长按时间
    500    	// repeatTime: 1000ms长按重复时间
};

/* 按键控制数据 */
 key_control_struct_t keyControl = {
    10,                // quantity: 初始数量为10
    SPEED_LEVEL_1,     // speed: 初始速度为1档
    MODE_ALWAYS_ON,    // mode: 初始模式为常亮
    1                  // color: 初始颜色为1
};

/**
 * @brief 初始化按键控制模块
 */
void init_key_control(void)
{
    uint8_t i = 0;
    // 配置按键引脚为输入模式
    PAOE &= ~0x0F;  // 使能PA0-PA3输入
    PAPU |= 0x0F;    // 使能PA0-PA3上拉
    
    // 初始化按键状态
    for(i = 0; i < KEY_CNT; i++) {
        keyStatus[i].state = KEY_STATE_RELEASED;
        keyStatus[i].pressTime = 0;
        keyStatus[i].keyState = KEY_ALREADY_PRO;
    }
}

/**
 * @brief 扫描按键状态
 */
void scan_key_status(void)
{
//    static uint16_t lastScanTime = 0;
    uint8_t i = 0;
    uint16_t currentTime = 0;
		uint8_t currentValue = 1;
    currentTime = get_system_time();
    
//    // 每10ms扫描一次按键
//    if(currentTime - lastScanTime < 5) {
//        return;
//    }
//    lastScanTime = currentTime;
    
    // 扫描每个按键
    for(i = 0; i < KEY_CNT; i++) {
       
        // 获取当前按键值
        switch(i) {
            case KEY_TYPE_QUANTITY:
                currentValue = KEY_QUANTITY_VALUE;
                break;
            case KEY_TYPE_SPEED:
                currentValue = KEY_SPEED_VALUE;
                break;
            case KEY_TYPE_MODE:
                currentValue = KEY_MODE_VALUE;
                break;
            case KEY_TYPE_FUNCTION:
                currentValue = KEY_FUNCTION_VALUE;
                break;
            default:
                currentValue = 1;
                break;
        }
        
        switch(keyStatus[i].state) {
            case KEY_STATE_RELEASED:
                if(currentValue == 0) {  // 按键按下
                    keyStatus[i].state = KEY_STATE_DEBOUNCE;
                    keyStatus[i].pressTime = currentTime;
                }
                break;
                
            case KEY_STATE_DEBOUNCE:
                if(currentValue == 0) {  // 消抖
                    if(currentTime - keyStatus[i].pressTime >= keyConfig.debounceTime) {
                        keyStatus[i].state = KEY_STATE_SHORT;
                        keyStatus[i].pressTime = currentTime;
                    }
                } else {  // 按键释放
                    keyStatus[i].state = KEY_STATE_RELEASED;
                }
                break;
                
            case KEY_STATE_SHORT:
                if(currentValue == 0) {  // 按键短按
                    if(currentTime - keyStatus[i].pressTime >= keyConfig.shortPressTime) {
                        keyStatus[i].state = KEY_STATE_LONG;
                        keyStatus[i].pressTime = currentTime;
                    }
                } else {  // 按键释放
                    keyStatus[i].state = KEY_STATE_RELEASED;
                }
                break;
				
						case KEY_STATE_LONG:
							if(currentValue == 0) {  // 按键长按
										if(currentTime - keyStatus[i].pressTime >= keyConfig.longPressTime) {
												keyStatus[i].state = KEY_STATE_REPEAT;
												keyStatus[i].pressTime = currentTime;
												keyStatus[i].keyState = KEY_LONG_PRESS;
										}
								} else {  // 按键释放
										keyStatus[i].state = KEY_STATE_RELEASED;
										keyStatus[i].keyState = KEY_SHORT_PRESS;
								}
							break;
							
						case KEY_STATE_REPEAT:
							if(currentValue == 0) {  // 按键重复按下
										if(currentTime - keyStatus[i].pressTime >= keyConfig.repeatTime) {
												keyStatus[i].pressTime = currentTime;
												keyStatus[i].keyState = KEY_LONG_PRESS;//KEY_LONG_PRESS_RESPEAT;
										}
								} else {  // 按键释放
										keyStatus[i].state = KEY_STATE_RELEASED;
								}
							break; 
                
        }
    }
}

/**
 * @brief 处理按键事件
 */
void process_key_event(void)
{
    uint8_t i = 0;
    scan_key_status();
    for(i = 0; i < KEY_CNT; i++) {
        switch(i) {
            case KEY_TYPE_QUANTITY:
                if(keyStatus[i].keyState == KEY_SHORT_PRESS) {
                    keyStatus[i].keyState = KEY_ALREADY_PRO;
										g_displayContentTimer = get_system_time();
										if(g_displayContentMode == DISPLAY_MODE_DEFAULT || g_displayContentMode == DISPLAY_MODE_QUANTITY){											
											// 新增：切换显示内容为数量，蜂鸣器长鸣
											if(g_displayContentMode == DISPLAY_MODE_QUANTITY) {
//													g_displayContentTimer = get_system_time();
													play_beep_short();
											} else {
													set_display_content_mode(DISPLAY_MODE_QUANTITY);
													play_beep_long();
													break;
											}
											// 原有数量处理
											if(keyControl.quantity < 150) {
													keyControl.quantity += 10;
											} else {
													keyControl.quantity = 10;  
											}
											write_info();
										}			
                } else if(keyStatus[i].keyState == KEY_LONG_PRESS) {
                    keyStatus[i].keyState = KEY_ALREADY_PRO;
										g_displayContentTimer = get_system_time();
										if(g_displayContentMode == DISPLAY_MODE_DEFAULT || g_displayContentMode == DISPLAY_MODE_QUANTITY){	
//											g_displayContentTimer = get_system_time();
											play_beep_short();
											// 长按减少数量
											if(keyControl.quantity > 10) {
															keyControl.quantity -= 10;
											} else {
															keyControl.quantity = 150;  
											}
											write_info();
									}
                }
                break;
            case KEY_TYPE_SPEED:
                if(keyStatus[i].keyState == KEY_SHORT_PRESS) {
                    keyStatus[i].keyState = KEY_ALREADY_PRO;
										g_displayContentTimer = get_system_time();
										if(g_displayContentMode == DISPLAY_MODE_DEFAULT || g_displayContentMode == DISPLAY_MODE_SPEED){	
											if(g_displayContentMode == DISPLAY_MODE_SPEED) {
//													g_displayContentTimer = get_system_time();
													play_beep_short();
											} else {
													set_display_content_mode(DISPLAY_MODE_SPEED);
													play_beep_long();
													break;
											}
											if(keyControl.speed < SPEED_LEVEL_5) {
													keyControl.speed++;
											} else {
													keyControl.speed = SPEED_LEVEL_1;
											}
											write_info();
										}
                } else if(keyStatus[i].keyState == KEY_LONG_PRESS) {
                    keyStatus[i].keyState = KEY_ALREADY_PRO;
										g_displayContentTimer = get_system_time();
										if(g_displayContentMode == DISPLAY_MODE_DEFAULT || g_displayContentMode == DISPLAY_MODE_SPEED){	
//											g_displayContentTimer = get_system_time();
											play_beep_short();
											// 长按减少速度
											if(keyControl.speed > SPEED_LEVEL_1) {
															keyControl.speed--;
											} else {
															keyControl.speed = SPEED_LEVEL_5;
											}
											write_info();
										}
                }
                break;
            case KEY_TYPE_MODE:
                if(keyStatus[i].keyState == KEY_SHORT_PRESS) {
                    keyStatus[i].keyState = KEY_ALREADY_PRO;
										g_displayContentTimer = get_system_time();
										if(g_displayContentMode == DISPLAY_MODE_DEFAULT || g_displayContentMode == DISPLAY_MODE_MODE){	
											if(g_displayContentMode == DISPLAY_MODE_MODE) {
//													g_displayContentTimer = get_system_time();
													play_beep_short();
											} else {
													set_display_content_mode(DISPLAY_MODE_MODE);
													play_beep_long();
													break;
											}
											if(keyControl.mode < MODE_RAINBOW) {
													keyControl.mode++;
											} else {
													keyControl.mode = MODE_ALWAYS_ON;
											}
											write_info();
										}
                } else if(keyStatus[i].keyState == KEY_LONG_PRESS) {
                    keyStatus[i].keyState = KEY_ALREADY_PRO;
										g_displayContentTimer = get_system_time();
										if(g_displayContentMode == DISPLAY_MODE_DEFAULT || g_displayContentMode == DISPLAY_MODE_MODE){	
//											g_displayContentTimer = get_system_time();
											play_beep_short();
											// 长按切换模式
											if(keyControl.mode > MODE_ALWAYS_ON) {
															keyControl.mode--;
											} else {
															keyControl.mode = MODE_RAINBOW; 
											}
											write_info();
										}
                }
                break;
            case KEY_TYPE_FUNCTION:
                if(keyStatus[i].keyState == KEY_SHORT_PRESS) {
                    keyStatus[i].keyState = KEY_ALREADY_PRO;
										g_displayContentTimer = get_system_time();
										if(g_displayContentMode == DISPLAY_MODE_DEFAULT || g_displayContentMode == DISPLAY_MODE_COLOR){	
											if(g_displayContentMode == DISPLAY_MODE_COLOR) {
//													g_displayContentTimer = get_system_time();
													play_beep_short();
											} else {
													set_display_content_mode(DISPLAY_MODE_COLOR);
													play_beep_long();
													break;
											}
											if(keyControl.color < 10) {
													keyControl.color++;
											} else {
												 keyControl.color = 1;
											}
											write_info();
										}
                } else if(keyStatus[i].keyState == KEY_LONG_PRESS) {
                    keyStatus[i].keyState = KEY_ALREADY_PRO;
										g_displayContentTimer = get_system_time();
										if(g_displayContentMode == DISPLAY_MODE_DEFAULT || g_displayContentMode == DISPLAY_MODE_COLOR){	
//											g_displayContentTimer = get_system_time();
											play_beep_short();
											// 长按切换颜色
											if(keyControl.color > 1) {
															keyControl.color--;
											} else {
															keyControl.color = 10;  // 达到下限提示
											}
											write_info();
										}
                }
                break;
        }
    }
}

/**
 * @brief 获取当前数量值
 * @return 当前数量值(10-150)
 */
uint8_t get_key_quantity(void)
{
    return keyControl.quantity;
}

/**
 * @brief 获取当前速度档位
 * @return 当前速度档位(1-5)
 */
speed_level_enumType_t get_key_speed(void)
{
    return keyControl.speed;
}

/**
 * @brief 获取当前模式
 * @return 当前模式(1-5)
 */
mode_enumType_t get_key_mode(void)
{
    return keyControl.mode;
}

/**
 * @brief 获取当前颜色
 * @return 当前颜色(1-10)
 */
uint8_t get_key_color(void)
{
    return keyControl.color;
}

/**
 * @brief 设置当前数量值
 * @return 当前数量值(10-150)
 */
void set_key_quantity(uint8_t pdat)
{
    keyControl.quantity = pdat;
}

/**
 * @brief 设置当前速度档位
 * @return 当前速度档位(1-5)
 */
void set_key_speed(uint8_t pdat)
{
    keyControl.speed = pdat;
}

/**
 * @brief 设置当前模式
 * @return 当前模式(1-5)
 */
void set_key_mode(uint8_t pdat)
{
    keyControl.mode = pdat;
}

/**
 * @brief 设置当前颜色
 * @return 当前颜色(1-10)
 */
void set_key_color(uint8_t pdat)
{
    keyControl.color = pdat;
}

